package Model;

import java.awt.BasicStroke;
import java.awt.Graphics2D;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


/** 
 *  L'élément 'ellipse' définit une ellipse, alignée sur les axes du système de coordonnées utilisateur et basée sur un point central et deux rayons.
 *  
 *  @author Kilian Cousein et Benjamin Tardieu
 */
public class Ellipse extends MotifRectangulaire 
{
	
//======================================================================//
//========================== Constructeurs =============================//
//======================================================================//
	
	/**
	 * Crée une nouvelle instance de <i>Ellipse</i> par défaut.
	 */
	public Ellipse()
	{
	}
	
	
	/**
	 * Crée une nouvelle instance de <i>Ellipse</i> qui sera un clone de <i>motif</i>.
	 * 
	 * @param motif Motif
	 */
	public Ellipse(Motif motif)
	{	
		super(motif);
	}
	
//======================================================================//
//==================== Écriture méthodes abstraites ====================//
//======================================================================//
	
	@Override
	public void dessinerMotif(Graphics2D g) 
	{
		g.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, this.opacite));	
		g.setColor(this.couleur);
		g.fillOval(this.x, this.y, this.largeur, this.hauteur);
		
		if(this.largeurBordure > 0)
		{
			g.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, this.opaciteBordure));	
			g.setColor(this.couleurBordure);
			g.setStroke(new BasicStroke(this.largeurBordure));
			g.drawOval(this.x, this.y, this.largeur, this.hauteur);
		}
		
		g.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, 1.0f));	
	}

	
	@Override
	public Element enregistrer(Document doc)
	{
		Element ellipse = doc.createElement("ellipse");
		ellipse.setAttribute("rx", ""+this.largeur / 2);
		ellipse.setAttribute("ry", ""+this.hauteur / 2);
		ellipse.setAttribute("cx", ""+(this.x + this.largeur / 2));
		ellipse.setAttribute("cy", ""+(this.y + this.hauteur / 2));
		
		if(this.couleur != null)
			ellipse.setAttribute("fill", "rgb("+this.couleur.getRed()+","+this.couleur.getGreen()+","+this.couleur.getBlue()+")");
		
		if(this.largeurBordure > 0)
		{
			ellipse.setAttribute("stroke-width", ""+this.largeurBordure);
			ellipse.setAttribute("stroke", "rgb("+this.couleurBordure.getRed()+","+this.couleurBordure.getGreen()+","+this.couleurBordure.getBlue()+")");
		}
		
		if(this.opacite < 1.0f)
		{
			ellipse.setAttribute("opacity", ""+this.opacite);
		}
		
		if(this.opaciteBordure < 1.0f)
		{
			ellipse.setAttribute("opacity-stoke", ""+this.opaciteBordure);
		}
		
		return ellipse;
	}
	
	
	@Override
	public void ouvrir(Node node)
	{
		Node attribut;
		
		for(int j = 0; j < node.getAttributes().getLength(); j++)
		{
			attribut = node.getAttributes().item(j);
			
			if(attribut.getNodeName() == "cx")
				this.x = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "cy")
				this.y = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "rx")
				this.largeur = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "ry")
				this.hauteur = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "fill")
				this.couleur = this.convertitStringCouleur(attribut.getNodeValue());
			else if(attribut.getNodeName() == "stroke-width")
				this.largeurBordure = Integer.valueOf(attribut.getNodeValue());
			else if(attribut.getNodeName() == "stroke")
				this.couleurBordure = this.convertitStringCouleur(attribut.getNodeValue());
			else if(attribut.getNodeName() == "opacity")
			{
				this.opacite = Float.valueOf(attribut.getNodeValue());
				this.opaciteBordure = Float.valueOf(attribut.getNodeValue());
			}
			else if(attribut.getNodeName() == "stroke-opacity")
				this.opaciteBordure = Float.valueOf(attribut.getNodeValue());
		}
		
		this.x -= this.largeur;
		this.y -= this.hauteur;
		this.largeur *= 2;
		this.hauteur *= 2;
	}

	
	@Override
	public Motif nouvelleInstance() 
	{
		Ellipse ellipse = new Ellipse();
		ellipse.setCouleur(couleur);
		ellipse.setCouleurBordure(this.couleurBordure);
		
		return ellipse;
	}
	
	
	@Override
	public Motif clone()
	{
		return new Ellipse(this);
	}
}